import { TMap } from '../map'

import { DefinedOverlayTypeEnum } from './enum'

/**
 * 叠加层的属性对象
 */
export interface OverlayOptions {
    /**
     * 叠加层类型
     *
     * 已定义的类型有：
     * `Label` 类型为 `1`;
     * `Marker` 类型为 `2`;
     * `InfoWindow` 类型为 `3`;
     * `Polyline` 类型为 `4`;
     * `Polygon` 类型为 `5`;
     * `Rectangle` 类型为 `6`;
     * `Circle` 类型为 `8`;
     *
     * 对于自定义叠加层，也可以设定一个 `number` 型的叠加层类型
     */
    type: DefinedOverlayTypeEnum | (number & { __custom_overlay: never })
}

/**
 * 叠加层
 */
export interface Overlay {
    /**
     * 构造函数时传递参数，对 `OverlayOptions` 属性值进行赋值
     */
    initialize: (opt: OverlayOptions) => void;

    /**
     * 向地图上添加叠加物。
     * 当调用 `map.addOverLay` 时，`API` 将调用此方法。
     * 自定义叠加物时需要实现此方法。
     * 自定义叠加物时需要将覆盖物对应的 `HTML` 元素返回
     *
     * @param map `Map` 对象
     */
    onAdd: (map: TMap) => void;

    /**
     * 移除叠加物，释放覆盖物对象所占用的内存。
     * 自定义叠加物时需要实现此方法
     */
    onRemove: () => void;

    /**
     * 当地图状态发生变化时，由系统调用对覆盖物进行绘制。
     * 自定义覆盖物需要实现此方法
     */
    update: () => void;

    /**
     * 在地图上显示叠加层
     */
    show: () => void;

    /**
     * 在地图上隐藏叠加层
     */
    hide: () => void;

    /**
     * 判断叠加层是否隐藏，返回 `true` 表示当前叠加层是隐藏的，否则是处于显示状态
     */
    isHidden: () => boolean;

    /**
     * 对 `OverlayOptions` 属性值赋值
     */
    setOptions: (opt: OverlayOptions) => OverlayOptions;

    /**
     * 返回叠加物所在的容器的标签
     */
    getElement: () => HTMLElement
}
